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.
Bài liên quan
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:
Cuối cùng là xem đã thêm permission trong manifest hay chưa.
Mình làm được rồi bạn, cảm ơn bạn nhé!
Rất đầy đủ.