显示java.lang.NullPointerException:尝试调用虚拟方法android.view.View .MainActivity.findViewById(INT)'对空对象引用 [英] java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View .MainActivity.findViewById(int)' on a null object reference

查看:1445
本文介绍了显示java.lang.NullPointerException:尝试调用虚拟方法android.view.View .MainActivity.findViewById(INT)'对空对象引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一类叫做 MainActivity.java 调用一个的AsyncTask 类。最后一类具有 findViewById()在执行这个错误:

 显示java.lang.NullPointerException:尝试调用虚函数的空对象引用android.view.View< .MainActivity.findViewById(INT); mypackage的&GT
 

我不明白我怎么可以编辑的ImageView 位于 R.layout.activity_main ,一个后的AsyncTask 完成工作。

MainActivity.java

 公共类MainActivity延伸活动{

    公共MainActivity(){}

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        新的连接()执行();
    }

}
 

Connection.java

 公共类连接扩展的AsyncTask<字符串,太虚,字符串> {
    公共字符串的结果;

    //我知道,这是不正确的,我该怎么办?
    公共MainActivity MainActivity;

    @覆盖
    保护字符串doInBackground(字符串...为arg0){
        // TODO自动生成方法存根
                // ...

        返回字符串;
    }

    保护无效onPostExecute(字符串结果){
        super.onPostExecute(结果);
                    // ...

            //当生成错误
            ImageView的形象=(ImageView的)MainActivity.findViewById(R.id.image);

            // ...

    }
}
 

解决方案

该错误是

 公共MainActivity MainActivity;
 

从未初始化,从而指向空。 为了让您的code正常工作的最低步骤是 在MainActivity

 新的连接(本).execute();
 

在连接

 公共类连接扩展的AsyncTask<字符串,太虚,字符串> {

    公共MainActivity MainActivity;

    公共连接(MainActivity活动){
        MainActivity =活动;
    }
 

但创造的onCreate任务,并通过一个活动是不是反正最好的主意。 此外,字段名应该总是以一个小写字母。

最好的办法是通过一个ImageView的到AsyncTask的。 不要启动任务,直到活动开始,也不要忘了取消时,活动停止的任务。

 公开最后一类MainActivity延伸活动{

    公共MainActivity(){}

    专用连接的连接;
    私人ImageView的ImageView的;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        ImageView的=(ImageView的)findViewById(R.id.image);
    }

    @覆盖
    保护无效的OnStart(){
        super.onStart();
        如果(连接== NULL || connection.getStatus()!= AsyncTask.Status.RUNNING){
            连接=新的连接(ImageView的);
            connection.execute();
        }
    }

    @覆盖
    保护无效的onStop(){
        super.onStop();
        如果(连接= NULL和放大器;!&安培; connection.getStatus()== AsyncTask.Status.RUNNING){
            connection.cancel(真正的);
        }
    }

}
 

在Connection.java,存储一个ImageView的一个WeakReference的,防止泄漏。

 公开最后一类连接扩展的AsyncTask<字符串,太虚,字符串> {

    私人最终的WeakReference< ImageView的> imageViewRef;

    公共连接(ImageView的视图){
        imageViewRef =新的WeakReference< ImageView的>(视图);
    }

    @覆盖
    保护字符串doInBackground(字符串...为arg0){
        // TODO自动生成方法存根
                // ...

        返回字符串;
    }

    @覆盖
    保护无效onPostExecute(字符串结果){
        super.onPostExecute(结果);
                // ...

        最后的ImageView ImageView的= imageViewRef.get();
        //如果活动还活着,ImageView的将不能为空
        如果(ImageView的!= NULL){
            //设置图像或任何你需要
            image.setImageResource(666);
        }

    }
 

I have a class called MainActivity.java that call an AsyncTask class. The last class have a findViewById() that in execution return this error:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View <mypackage>.MainActivity.findViewById(int)' on a null object reference

I don't understand how can I edit an ImageView positioned in R.layout.activity_main after that an AsyncTask finish to work.

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

            //...

    }
}

解决方案

The error is that

public MainActivity MainActivity;

is never initialized, thus pointing to null. To make your code work the minimum step is in MainActivity

new Connection(this).execute();

In Connection

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

    public MainActivity MainActivity;

    public Connection(MainActivity activity) {
        MainActivity = activity;
    }

But creating a task in onCreate and passing an Activity is not the best idea anyway. Also, field names should always start with a lowercase letter.

The best way is passing an ImageView to the AsyncTask. Don't start a task until the Activity is started and also, don't forget to cancel the task when the Activity is stopped.

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

}

In Connection.java, store an ImageView as a WeakReference to avoid leaks.

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

    }

这篇关于显示java.lang.NullPointerException:尝试调用虚拟方法android.view.View .MainActivity.findViewById(INT)'对空对象引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆