活动 - BackgroundTask投掷运行时

时间:2017-01-26 17:28:41

标签: java android android-activity interface background-task

在我继续之前,我想说我在Android上的开发时间不到10小时,所以请温柔地回答你的问题。

我认为在尝试将值从后台任务返回到标签活动时,我有一个突破。阅读一些公平的线程,说明答案在于接口/监听器,所以我认为我已经做到了(下面)并且它会抛出一个运行时。

我将尝试在代码中添加注释,以便您可以按照

进行操作

标签活动

    public class Tab1Activity extends Activity implements ValueListener 
    {

        String task,username,password;

        @Override
        public void onValueComputed(String computedValue) 
        {
            //do something...
        }

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

            BackgroundTask backgroundTaskLogin = new BackgroundTask(Tab1Activity.this);    
            backgroundTaskLogin.execute(task,username,password);
        }
}

这是后台任务

public class BackgroundTask extends AsyncTask<String,Void,String>
 {
        Context context;




        BackgroundTask(Context ctx)
        {
            this.context = ctx;
        }

        @Override
        protected String doInBackground(String... params)
        {
          // do stuff
          return datastuff    
        }

/////////////////////////////////

 @Override
        protected void onPreExecute() 
        {
            super.onPreExecute();


        }
///////////////////////////////////////


        @Override
        protected void onProgressUpdate(Void... values) 
        {
            super.onProgressUpdate(values);
        }


//////////////////////////////


        ValueListener listener;

        public void MyAsyncTask (ValueListener valueListener) 
        {
            this.listener = valueListener;
        }

        @Override
         protected void onPostExecute(String result)
         {


            listener.onValueComputed(result);

// The value gets here OK - but when adding the above listener it throws a runtime

            System.out.println("kkkkkkkkkkkkkkkkkk"+result);

         }

这是界面

public interface ValueListener
{
      public void onValueComputed(String computedValue);

}

这是错误

01-26 17:26:20.935: E/AndroidRuntime(869): FATAL EXCEPTION: main
01-26 17:26:20.935: E/AndroidRuntime(869): Process: com.example.tabdemo, PID: 869
01-26 17:26:20.935: E/AndroidRuntime(869): java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.tabdemo.ValueListener.onValueComputed(java.lang.String)' on a null object reference
01-26 17:26:20.935: E/AndroidRuntime(869):  at com.example.tabdemo.BackgroundTask.onPostExecute(BackgroundTask.java:223)
01-26 17:26:20.935: E/AndroidRuntime(869):  at com.example.tabdemo.BackgroundTask.onPostExecute(BackgroundTask.java:1)
01-26 17:26:20.935: E/AndroidRuntime(869):  at android.os.AsyncTask.finish(AsyncTask.java:651)
01-26 17:26:20.935: E/AndroidRuntime(869):  at android.os.AsyncTask.access$500(AsyncTask.java:180)
01-26 17:26:20.935: E/AndroidRuntime(869):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
01-26 17:26:20.935: E/AndroidRuntime(869):  at android.os.Handler.dispatchMessage(Handler.java:102)
01-26 17:26:20.935: E/AndroidRuntime(869):  at android.os.Looper.loop(Looper.java:158)
01-26 17:26:20.935: E/AndroidRuntime(869):  at android.app.ActivityThread.main(ActivityThread.java:7224)
01-26 17:26:20.935: E/AndroidRuntime(869):  at java.lang.reflect.Method.invoke(Native Method)
01-26 17:26:20.935: E/AndroidRuntime(869):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
01-26 17:26:20.935: E/AndroidRuntime(869):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

在我尝试添加监听器之前,一切都很好,问题是显而易见的

2 个答案:

答案 0 :(得分:0)

 @Override
         protected void onPostExecute(String result)
         {


            listener.onValueComputed(result);

// The value gets here OK - but when adding the above listener it throws a runtime

            System.out.println("kkkkkkkkkkkkkkkkkk"+result);

         }

您尚未定义听众,因此导致NPE

 listener.onValueComputed(result);

答案 1 :(得分:0)

您尚未初始化ValueListener对象。我认为你搞砸了构造函数逻辑。这是你的构造函数:

BackgroundTask(Context ctx) {
    this.context = ctx;
}

还有另一种方法,你可能会混淆你的构造函数,但它不是。

public void MyAsyncTask (ValueListener valueListener) {
            this.listener = valueListener;
        }

既然你从未调用MyAsyncTask(ValueListener valueListener),那么你的listener对象引用为空,因此java.lang.NullPointerException

这是你应该做的:

public class BackgroundTask extends AsyncTask<String,Void,String>
{        
    private ValueListener listener;

    BackgroundTask(ValueListener listener)
    {
        this.listener= listener;
    }
}