错误是
public MainActivity MainActivity;
永远不会初始化,因此指向null。为了使您的代码正常工作,最小的步骤是在MainActivity中
new Connection(this).execute();
在连接
public class Connection extends AsyncTask<String, Void, String> { public MainActivity MainActivity; public Connection(MainActivity activity) { MainActivity = activity; }但是无论如何,在onCreate中创建任务并传递Activity并不是最好的主意。另外,字段名称应始终以小写字母开头。
最好的方法是将ImageView传递给AsyncTask。在启动“活动”之前不要启动任务,而且,在“活动”停止后也不要忘记取消任务。
public final class MainActivity extends Activity { public MainActivity() {} private Connection connection; private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.image); } @Override protected void onStart() { super.onStart(); if (connection == null || connection.getStatus() != AsyncTask.Status.RUNNING) { connection = new Connection(imageView); connection.execute(); } } @Override protected void onStop() { super.onStop(); if (connection != null && connection.getStatus() == AsyncTask.Status.RUNNING) { connection.cancel(true); } }}在Connection.java中,将ImageView存储为WeakReference以避免泄漏。
public final class Connection extends AsyncTask<String, Void, String> { private final WeakReference<ImageView> imageViewRef; public Connection(ImageView view) { imageViewRef = new WeakReference<ImageView>(view); } @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub //... return "a string"; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); //... final ImageView imageView = imageViewRef.get(); // if the Activity is still alive, the ImageView will not be null if (imageView != null) { // set an image or whatever you need image.setImageResource(666); } }


