30/09/2018, 21:24

Hỏi về async trong Android

Xin chào mọi người, mình đang học lập trình android qua mạng, tới clip này:

Thì khi mình làm theo, bị báo lỗi ngay tại dòng Image.setImageBitmap(Bmp); mọi người xem giúp mình với.
Code của mình như sau:
package com.example.lenghia.asyn;

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

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

public class MainActivity extends AppCompatActivity {

    ImageView image;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        image=(ImageView)findViewById(R.id.hinhlogo);
        
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                new LoadImageformInternet().execute("http://9mobi.vn/cf/images/2015/03/nkk/hinh-dep-1.jpg");
            }
        });
    }

    private class LoadImageformInternet extends AsyncTask<String,Integer,String>{

        @Override
        protected String doInBackground(String... params) {
            try {
                URL u=new URL(params[0]);
                Bitmap Bmp=BitmapFactory.decodeStream(u.openConnection().getInputStream());
                image.setImageBitmap(Bmp);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;

        }
    }
}

Ngoài ra, mọi người có thể nói rõ hơn về ý nghĩa và cách dùng async được không? Chứ mình vẫn không hiểu lắm. Xin cảm ơn.

Nguyen Ca viết 23:40 ngày 30/09/2018

Không đưa lỗi lên, ai mà giúp. Úp lỗi lên.
Cơ mà lỗi là thế này:
Đang dùng asnyc có nghĩa là xử lý bất đồng bộ, hàm doInBackground đang xử lý, chư biết khi nao xong mà set vao image làm gì.
Image nằm trên UI nên overide hàm này:

 protected void onPostExecute(Long result) {
       // code here
     }

hình tham khảo:

ref: https://developer.android.com/reference/android/os/AsyncTask.html?hl=vi
Làm gì cũng vậy, nến đọc qua lý thuyết trước. Step by step từng bước hướng dẫn trên mạng cũng không tốt.

Hung Nguyen viết 23:31 ngày 30/09/2018

cái image.setImageBitmap(Bmp); bạn phải “do on UI theard” chứ không được đặt trong hàm “doInBackground”. Bạn nên đọc lại về AsynTask ở đây https://developer.android.com/reference/android/os/AsyncTask.html.
Đặc biệt chú ý phần “The 4 steps”

NamTS viết 23:29 ngày 30/09/2018

đại khái là trong doInBackground không được thay đổi giao diện, chỉ tính toán logic thôi.

Bài liên quan
0