java.lang.NullPointerException:尝试调用虚拟方法';findViewById(int)和#x27;关于空对象引用

java.lang.NullPointerException:尝试调用虚拟方法';findViewById(int)和#x27;关于空对象引用,java,android,android-asynctask,Java,Android,Android Asynctask,我有一个名为MainActivity.java的类,它调用一个AsyncTask类。最后一个类有一个findViewById(),该类在执行时返回以下错误: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View <mypackage>.MainActivity.findViewById(int)' on a null object reference Connectio

我有一个名为MainActivity.java的类,它调用一个
AsyncTask
类。最后一个类有一个
findViewById()
,该类在执行时返回以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View <mypackage>.MainActivity.findViewById(int)' on a null object reference
Connection.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();
    }

}
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);

            //...

    }
}
公共类连接扩展了异步任务{
公共字符串结果;
//我知道,这不对,我该怎么办?
公共活动;
@凌驾
受保护的字符串doInBackground(字符串…arg0){
//TODO自动生成的方法存根
//...
返回“字符串”;
}
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
//...
//生成错误的位置
ImageView image=(ImageView)MainActivity.findViewById(R.id.image);
//...
}
}

将imageview作为类的变量

private ImageView image;
在onCreate上初始化

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

        //...

    }
}
image=(ImageView)findviewbyd(R.id.image);
公共类连接扩展了异步任务{
公共字符串结果;
//我知道,这不对,我该怎么办?
公共活动;
@凌驾
受保护的字符串doInBackground(字符串…arg0){
//TODO自动生成的方法存根
//...
返回“字符串”;
}
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
//...
//生成错误的位置
//使用imageview执行其他操作
//...
}
}
错误是

public MainActivity MainActivity;
从未初始化,因此指向null。 要使代码正常工作,最起码的步骤是 主要活动

new Connection(this).execute();
联系

public class Connection extends AsyncTask<String, Void, String> {

    public MainActivity MainActivity;

    public Connection(MainActivity activity) {
        MainActivity = activity;
    }
在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);
        }

    }
公共最终类连接扩展了异步任务{
私有最终WeakReference imageViewRef;
公共连接(图像视图){
imageViewRef=新的WeakReference(视图);
}
@凌驾
受保护的字符串doInBackground(字符串…arg0){
//TODO自动生成的方法存根
//...
返回“字符串”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
//...
final ImageView ImageView=imageViewRef.get();
//如果活动仍处于活动状态,则ImageView将不为null
如果(imageView!=null){
//设置一个图像或任何你需要的东西
image.setImageResource(666);
}
}

您没有指定传递给
Connection.java AsyncTask
的参数

我的一个学生也有同样的问题。 虽然他正在使用
Volley库
进行
HttpConnection
(发布数据),但主要问题是: 他直接编写
URL
,没有http协议前缀,即

String post\u url=“api/do\u post”

只需在帖子url前面添加
http/https

String post\u url=”http://api/do_post“;


实际上我在做一个活动和服务应用程序。我也遇到了同样的问题, 在bindservice中,我使用了BIND\u重要标志,而不是使用BIND\u AUTO\u CREATE


一旦我更改了标志,它就成功地为我工作了。

您不能这样做。您需要系统提供的活动对象的实际实例。通常,您不希望从另一个类修改活动的UI,但如果必须,您必须将活动对象传递给该类,以便它可以使用的实例方法那个对象。@doctordrive事实上我要求了解更多关于java的知识:)
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);
        }

    }