繁体   English   中英

Java Android-带导航抽屉的AsyncTask

[英]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

您应该保留对当前执行的AsyncTask的引用。 然后,在Fragment的onStop()方法中(或每当任务不再有用时,例如,如果您要丢弃它并运行一个新任务),就对任务调用cancel()

这将防止为该任务触发onPostExecute()方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM