public class get extends AsyncTask<String,Void,Void>
{
@Override
protected Void doInBackground(String... params) {
// TODO Auto-generated method stub
try {
URL url = new URL("http://c69282.r82.cf3.rackcdn.com/IMG_0755-Edit-4.jpg") ;
URLConnection connect = url.openConnection();
InputStream in = new BufferedInputStream(connect.getInputStream());
Bitmap img = BitmapFactory.decodeStream(in);
image.setImageBitmap(img);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
这是我的AsyncTask
,当我尝试在主线程中运行它时,应用程序崩溃了。
如果我键入
,它可以正常工作StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build();
StrictMode.setThreadPolicy(policy);
然而,创建AsyncTask
的重点是摆脱使用该代码的需要。
更新:我将post.setImageBitmap(img)放在post执行上并且它工作正常。谢谢你们!
答案 0 :(得分:3)
您无法从doInbackground()
更新ui。在后台线程上调用doInbackground
。 Ui应该在ui线程上更新。在ui线程上调用onPostExecute
。 doInbackground
计算的结果是onPostExecute
的参数。因此,请在doInbackground
中返回结果,并在onPostExecute
中更新ui。
http://developer.android.com/reference/android/os/AsyncTask.html
上述链接中的4个步骤部分下的检查主题。
image.setImageBitmap(img);
您应该在onPostExecute
中更新ui或使用runOnUiThread
。
但我建议您在onPostExecute
更新ui。
runOnUiThread(new Runnable() //run on ui thread
{
public void run()
{
// update ui
}
});
答案 1 :(得分:1)
我认为您正在使用doInBackground()
方法进行UI操作。
image.setImageBitmap(img);
您应该使用onPostExecute()
方法执行此操作。
您应该只在doInBackground()
方法中执行非UI操作。
答案 2 :(得分:0)
您无法在doInBackground()
更新自己的用户界面,只需在onPostExecute()
更新自己的用户界面即可。
因此,请使用以下代码更新图像。
public class get extends AsyncTask<String,Void,Void>
{
Bitmap img;
@Override
protected Void doInBackground(String... params) {
// TODO Auto-generated method stub
try {
URL url = new URL("http://c69282.r82.cf3.rackcdn.com/IMG_0755-Edit-4.jpg") ;
URLConnection connect = url.openConnection();
InputStream in = new BufferedInputStream(connect.getInputStream());
img = BitmapFactory.decodeStream(in);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap result)
{
image.setImageBitmap(img);
}
}
此处您还提到了有关变量image
的任何内容。您应该在onPostExecute()
中对Imageview进行充气,然后添加用于设置图像位图的行。