我有一个名为 MainActivity.java 的类,它调用AsyncTask
类。最后一个类有findViewById()
,执行时会返回此错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View <mypackage>.MainActivity.findViewById(int)' on a null object reference
我不明白如何在ImageView
完成R.layout.activity_main
之后编辑位于AsyncTask
的{{1}}。
MainActivity.java
public class MainActivity extends Activity {
public MainActivity() {}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Connection().execute();
}
}
Connection.java
public class Connection extends AsyncTask<String, Void, String> {
public String result;
//I know, this isn't correct, how can i do?
public MainActivity MainActivity;
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
//...
return "a string";
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
//...
// Where the error is generated
ImageView image = (ImageView) MainActivity.findViewById(R.id.image);
//...
}
}
答案 0 :(得分:8)
错误就是
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。 在Activity启动之前不要启动任务,并且不要忘记在Activity停止时取消任务。
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);
}
}
答案 1 :(得分:0)
将imageview作为您班级的变量
private ImageView image;
image = (ImageView) findViewById(R.id.image);
public class Connection extends AsyncTask<String, Void, String> {
public String result;
//I know, this isn't correct, how can i do?
public MainActivity MainActivity;
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
//...
return "a string";
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
//...
// Where the error is generated
//do other stuff with your imageview
//...
}
}
答案 2 :(得分:0)
您没有指定传递给Connection.java AsyncTask
的参数。
我的一个学生也有同样的问题。
虽然他正在Volley Library
使用HttpConnection
(发布数据),但主要问题是:
他正在直接写URL
而没有 http 协议前缀,即。
String post_url ="api/do_post";
只需在帖子网址前面添加http/https
:
String post_url ="http://api/do_post";
答案 3 :(得分:0)
实际上我正在处理活动和服务应用程序。我也有同样的问题, 在bindservice中,我使用了BIND_IMPORTANT标志,而不是使用BIND_AUTO_CREATE。
一旦我改变了旗帜,它就成功地为我工作了。