【问题标题】:java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View .MainActivity.findViewById(int)' on a null object referencejava.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.view.View.MainActivity.findViewById(int)”
【发布时间】:2014-04-15 06:14:16
【问题描述】:

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

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

我不明白如何编辑位于R.layout.activity_main 中的ImageView,然后AsyncTask 完成工作。

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

            //...

    }
}

【问题讨论】:

  • 你不能那样做。您需要系统提供的 Activity 对象的实际实例。通常,您不希望从另一个类修改 Activity 的 UI,但如果必须,您必须将 Activity 对象传递给该类,以便它可以使用该对象的实例方法。
  • @DoctororDrive 实际上我要求更多地了解 java :)

标签: java android android-asynctask


【解决方案1】:

实际上,我正在开发一个活动和服务应用程序。我也遇到了同样的问题, 在 bindservice 中,我使用了 BIND_IMPORTANT 标志而不是使用 BIND_AUTO_CREATE。

一旦我更改了标志,它对我来说就成功了。

【讨论】:

    【解决方案2】:

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

    我的一个学生也有同样的问题。 尽管他将Volley Library 用于HttpConnection(发布数据),但主要问题是: 他直接写URL,没有http协议前缀,即

    String post_url ="api/do_post";

    只需在您的帖子网址前面添加http/https

    String post_url ="http://api/do_post";

    【讨论】:

      【解决方案3】:

      将 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
      
              //...
      
          }
      }
      

      【讨论】:

        【解决方案4】:

        错误在于

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

        【讨论】:

          猜你喜欢
          • 2020-09-17
          • 2015-04-20
          • 2015-08-17
          • 2019-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-23
          相关资源
          最近更新 更多