Android从AsyncTask获取MainActivity

时间:2014-03-21 10:22:27

标签: java android android-asynctask

单击按钮后我的应用程序崩溃,但代码执行正常。

public void makeLead(View v) throws Exception {
    try {
       RegisterTimer rt = new RegisterTimer();
       rt.ma = this;
       rt.execute(null);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public void log(String msg)
{
    final TextView tv = (TextView)findViewById(R.id.editText);
    tv.append(msg);
}
private class RegisterTimer extends AsyncTask {
    public MainActivity ma;


    @Override
    protected Object doInBackground(Object[] objects) {
        ma.log("ausd");
        return null;
    }
}

makeLeadonClick事件。方法ma.log生成错误但工作正常(msg已添加到textEdit)。当我删除ma.log时,应用程序不会崩溃。我的AndroidStudio中没有日志,因此无法看到错误消息。怎么了?

4 个答案:

答案 0 :(得分:2)

您无法从doInbackground更新ui。不需要初始化ma

使AsyncTask成为Activity的内部类,并在onPostExecute

中更新ui

或使用interface作为活动的回调

编辑:

要说清楚

  1. 使asynctaks成为一种内在的活动。将textview声明为实例变量。在doInbackground中返回结果
  2. 活动

         TextView tv;
         @Override
         public void onCreate(Bundle savedInstancestate)  
         super.onCreate(savedInstancestate); 
         setContentView(R.layout.yourlayout);
          tv = (TextView)findViewById(R.id.editText);
    

    然后

         @Override
         protected String doInBackground(Void objects) {
           // some background computation
         return "ausd";
         }
    
    1. onpostExecute

       @Override
       protected void onPostExecute(String result)
       {
       super.onPostExecute();
        tv.append(result);
       } 
      
    2. 你还需要

       private class RegisterTimer extends AsyncTask<Void,Void,String> {   // args missing      
      

答案 1 :(得分:2)

您无法触摸非UI线程中的View

并且您要在背景TextView中将文字附加到Thread,这是不允许的。

我希望MainActivityRegisterTimer的初始化没有问题,因为您没有手动创建Activity实例。初始化rt.ma = this正确。
为什么仅仅需要更改AsyncTask

的文字TextView

答案 2 :(得分:1)

如@Raghunandan所述,你还没有初始化ma。

接下来是你无法访问后台线程中的视图。

如果您的线程类在MainActivity类中,那么您可以使用

runOnUiThread(new Runnable() {

            @Override
            public void run() {
                ma.log("ausd");

            }
        });

在doInBackground方法中更新视图。

答案 3 :(得分:0)

您的方法日志是公共的,您不需要使MainActivity类的对象访问它,而是可以直接调用它。此外,您需要在ASYNC任务后添加一些模板,如果您想将一些输入传递给后台进程,那么您正在以错误的方式使用ASYNC任务。