【问题标题】:Java Android - AsyncTask with Navigation DrawerJava Android - 带导航抽屉的 AsyncTask
【发布时间】:2014-05-11 09:03:11
【问题描述】:

h1,我的问题: 启动 Fragment 时,它开始通过 AsyncTask JSON 下载文件,然后继续。 ListView中的Setadapter(),但是如果我改变Fragment,app就会崩溃,因为发生NullPointerException是因为(Acces error)。

当用户改变时,如何在片段中取消 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

【问题讨论】:

  • 你能显示源代码吗?
  • 能否也显示错误日志?
  • 是的,我更新了第一篇文章
  • 这是因为另一个任务开始了,第一个任务不再有访问权限。

标签: java android fragment navigation-drawer


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多