我如何从android中的AsyncTask获取UI引用

问题描述 投票:-1回答:2

我正在尝试在android中学习MultiThreading,尽管当我在Logcat窗口上打印数据时我的代码工作正常,但是当我尝试从asynctask更新组件时,我的应用程序崩溃并给了我一个空值异常。

它给我以下错误

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.append(java.lang.CharSequence)' on a null object reference
    at com.shivam.asynctasks.MainActivity.logm(MainActivity.java:41)

第41行

textView.append(message + "\n");

我的代码

    public class MainActivity extends AppCompatActivity {

    Button button ;
    TextView textView;
    String TAG = "MyTag";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button=findViewById(R.id.button);
        textView=findViewById(R.id.TextView);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String TAG ="MyTag";
                Log.d(TAG,"OnClick Thread Started");

                MyTask mytask =new MyTask();
                mytask.execute("Red","Black","Yellow","Blue","Orange");
            }
        });
    }


    public void logm(String message) {
        Log.d(TAG, message);
        textView.append(message + "\n");
    }
}

class MyTask extends AsyncTask<String,String,String>{

    @Override
    protected String doInBackground(String... strings) {
        String TAG = "MyTag";

        for (String value :
                strings) {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            Log.d(TAG, "do in Background  : "+value);
            publishProgress(value);

        }

        return null;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
         MainActivity mainActivity =new MainActivity();

        for (String color : values) {

            mainActivity.logm(color);
        }
    }
}
android android-asynctask
2个回答
0
投票
您需要引用您的活动,而不创建新活动。在这里您可以看到。

import android.os.AsyncTask; public class MainActivity extends AppCompatActivity { Button button ; TextView textView; String TAG = "MyTag"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button=findViewById(R.id.button); textView=findViewById(R.id.TextView); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String TAG ="MyTag"; Log.d(TAG,"OnClick Thread Started"); MyTask mytask =new MyTask(this); mytask.execute("Red","Black","Yellow","Blue","Orange"); } }); } public void logm(String message) { Log.d(TAG, message); textView.append(message + "\n"); } } class MyTask extends AsyncTask<String,String,String> { MainActivity mainActivity; public MyTask(MainActivity activity){ mainActivity = activity; } @Override protected String doInBackground(String... strings) { String TAG = "MyTag"; for (String value : strings) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } Log.d(TAG, "do in Background : "+value); publishProgress(value); } return null; } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); for (String color : values) { mainActivity.logm(color); } }


0
投票
您会收到此错误,因为您正在onProgressUpdate()方法内再次创建mainactivity类的实例,该方法的textView未初始化。这就是为什么由于未启动textview字段而导致空指针异常的原因。

您的问题有一个简单的解决方案。 onProgressUpdate()方法在主UI线程上运行,您可以访问onProgressUpdate()方法内的textview变量。因此只需执行以下操作:

@Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); MainActivity mainActivity =new MainActivity(); for (String color : values) { textView.append(color + "\n"); } }

© www.soinside.com 2019 - 2024. All rights reserved.