Activity - BackgroundTask 抛出运行时
Activity - BackgroundTask throwing runtime
在我继续之前,我想说我在 android 上的开发时间不到 10 小时,所以请温和地回答。
我认为我在尝试从后台任务将值返回到选项卡时取得了突破 activity。阅读了相当多的线程,说明答案在于接口/侦听器,所以我认为我做对了(下面)并且它抛出了一个运行时。
我会尝试在代码中添加注释,以便您可以关注
选项卡activity
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.access0(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)
一切正常,直到我尝试添加监听器,问题是什么很明显
@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);
}
您还没有定义 listener 所以它导致了
上的 NPE
listener.onValueComputed(result);
您还没有初始化 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;
}
}
在我继续之前,我想说我在 android 上的开发时间不到 10 小时,所以请温和地回答。
我认为我在尝试从后台任务将值返回到选项卡时取得了突破 activity。阅读了相当多的线程,说明答案在于接口/侦听器,所以我认为我做对了(下面)并且它抛出了一个运行时。
我会尝试在代码中添加注释,以便您可以关注
选项卡activity
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.access0(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)
一切正常,直到我尝试添加监听器,问题是什么很明显
@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);
}
您还没有定义 listener 所以它导致了
上的 NPE listener.onValueComputed(result);
您还没有初始化 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;
}
}