30/09/2018, 23:34

Cho hỏi đoạn chương trình Android sau sai ở đâu?

package inh_khc_quy_developer_apps.async;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    //khai bao bien. anh xa.
    ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //anh xa img.
        img = (ImageView) findViewById(R.id.anhTuInternet);

        //ham chay.
        //chay doInBackground("http://lucidtronix.com/system/attached_files/120/original/Screen_shot_2013-01-30_at_4.00.47_PM.png?1359580997").
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                new LoadHinhTuInternet().execute("http://lucidtronix.com/system/attached_files/120/original/Screen_shot_2013-01-30_at_4.00.47_PM.png?1359580997");
            }
        });
    }

    //ASYNC chạy trước:
    // tạo lớp kết thừa AsyncTask và hàm doInBackground @override.
    class LoadHinhTuInternet extends AsyncTask<String, Integer, String> {
        protected String doInBackground(String... params) {
            try {
                URL u = new URL(params[0]);
                // decodeStream tra ve 1 Bitmap. --> openConnection() tra ve 1 URLConnection
                //nhan dong code --> mo ket noi --> nhan dong du lieu data.
                Bitmap bmp = BitmapFactory.decodeStream(u.openConnection().getInputStream());
                img.setImageBitmap(bmp);//yeu cau doi so la 1 bit map de hien thi anh tren phone.
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }
        //Chạy sau:

        protected void onPostExecute(String s) {
            Toast.makeText(MainActivity.this, "A good picture of bitmap technology.", Toast.LENGTH_LONG).show();
        }
    }

}

–> ket qua la no chay roi thoat khoi man hinh dien thoai.

X viết 01:43 ngày 01/10/2018

Lỗi thông báo là gì nhỉ?
Mà dùng Async thì cũng không cần runOnUiThread làm gì.

Update:
Trong hàm doInBackground ta không được thực hiện những thay đổi liên quan đến giao diện: img.setImageBitmap(bmp)

Bạn đọc kỹ lại tài liệu xem 3 params trong AsyncTask<String, Integer, String> sử dụng như thế nào, Khi nào dùng String, khi nào dùng Integer…etc…

Có thể tạm sửa như sau:
AsyncTask<String, Void, Bitmap>
Trong doInBackground return thằng bmp
Trong onPostExecute:

protected void onPostExecute(Bitmap bmp) {
      img.setImageBitmap(bmp);
}

Cuối cùng là xem đã thêm permission trong manifest hay chưa.

Module Đk viết 01:35 ngày 01/10/2018

Mình làm được rồi bạn, cảm ơn bạn nhé!
Rất đầy đủ.

Bài liên quan
0