[英]Java Android - AsyncTask with Navigation Drawer
h1,我的问题:启动Fragment时,它将开始通过AsyncTask JSON下载文件,然后再下载文件。 ListView中的Setadapter(),但是如果我更改Fragment,应用程序将崩溃,因为发生NullPointerException是因为(Acces错误)。
当用户更改时,如何在片段中取消AsyncTask和setAdapter?
没有很多代码:
导航抽屉片段开始:
private void displayView(int position) {
android.app.Fragment fragment = null;
switch (position) {
case 0:
fragment = new FirstFragment();
break;
case 1:
fragment = new SecondFragment();
break;
case 2:
fragment = new OtherFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
Log.e("MainActivity", "Error in creating fragment");
}
}
在Fragment中启动AsyncTask:
new SingleTask(getActivity(), table_name, URL)
{
protected void onPostExecute(ArrayList<ItemInfo> item) {
feed_item = item;
SetAdapter();
}
}.execute();
带有AsyncTask的类:
public SingleTask(Context context, String table, String URLs)
{
thisContext = context;
URL = URLs;
table_name = table;
}
@Override
protected ArrayList<ItemInfo> doInBackground(Object... params) {
try {
db = new DatabaseStorage(thisContext);
JsonParser jParser = new JsonParser();
JSONObject json = jParser.getJSONFromUrl(URL);
dataJsonArr = json.getJSONArray("data");
if (getCount(table_name) != 0) { db.onDelete(table_name); }
for (int i = 0; i < dataJsonArr.length(); i++) {
JSONObject c = dataJsonArr.getJSONObject(i);
String nickname = c.getString("nickname");
db.insertLabel(nickname, table_name);
item.add(new ItemInfo(nickname));
}
} catch (JSONException e) {
throw new RuntimeException(e);
}
return item;
}
错误日志:
05-11 11:54:44.364: E/AndroidRuntime(31391): FATAL EXCEPTION: main
05-11 11:54:44.364: E/AndroidRuntime(31391): Process: com.app.gp, PID: 31391
05-11 11:54:44.364: E/AndroidRuntime(31391): java.lang.NullPointerException
05-11 11:54:44.364: E/AndroidRuntime(31391): at com.app.gp.BoxAdapter.<init>(BoxAdapter.java:34)
05-11 11:54:44.364: E/AndroidRuntime(31391): at com.app.gp.QuoteFragment.SetAdapter(QuoteFragment.java:140)
05-11 11:54:44.364: E/AndroidRuntime(31391): at com.app.gp.QuoteFragment$1.onPostExecute(QuoteFragment.java:83)
05-11 11:54:44.364: E/AndroidRuntime(31391): at com.app.gp.QuoteFragment$1.onPostExecute(QuoteFragment.java:1)
05-11 11:54:44.364: E/AndroidRuntime(31391): at android.os.AsyncTask.finish(AsyncTask.java:632)
05-11 11:54:44.364: E/AndroidRuntime(31391): at android.os.AsyncTask.access$600(AsyncTask.java:177)
05-11 11:54:44.364: E/AndroidRuntime(31391): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
05-11 11:54:44.364: E/AndroidRuntime(31391): at android.os.Handler.dispatchMessage(Handler.java:102)
05-11 11:54:44.364: E/AndroidRuntime(31391): at android.os.Looper.loop(Looper.java:136)
05-11 11:54:44.364: E/AndroidRuntime(31391): at android.app.ActivityThread.main(ActivityThread.java:5017)
05-11 11:54:44.364: E/AndroidRuntime(31391): at java.lang.reflect.Method.invokeNative(Native Method)
05-11 11:54:44.364: E/AndroidRuntime(31391): at java.lang.reflect.Method.invoke(Method.java:515)
05-11 11:54:44.364: E/AndroidRuntime(31391): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-11 11:54:44.364: E/AndroidRuntime(31391): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-11 11:54:44.364: E/AndroidRuntime(31391): at dalvik.system.NativeStart.main(Native Method)
QuoteFragment其SecondFragment
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.