代码之家  ›  专栏  ›  技术社区  ›  Samuel

如何在顶级AsyncTask类中制作Toast

  •  -1
  • Samuel  · 技术社区  · 6 年前

    我有一个扩展AsyncTask的顶级Fetch类,还有一个MainActivity。由于没有MainActivity的实例或其上下文,我无法让Fetch类进行Toast。我试图将mainActivity传递给fetch类,但它可能会泄漏内存。我试过为上下文设置一个weakreference实例,但我不能从中举杯。

    我读过很多其他关于这方面的文章,大多数似乎都有一个静态的内部类,但我的是顶级的,我更愿意这样做。

    mainActivity创建一个fetch实例,然后执行它。

    public class Fetch extends AsyncTask<Void, Integer, List<List<String>>>
        {
        @Override
        protected void onPreExecute()
            {
            super.onPreExecute();
            }
        @Override
        protected List<List<String>> doInBackground(Context... params)
            {
            // run tasks
            }
        @Override
        protected void onProgressUpdate(Integer... progress)
            {
            }
        @Override
        protected void onPostExecute(List<List<String>> result)
            {
            super.onPostExecute(result);
            }
        }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   navylover    6 年前

    一种方式 doInBackground :

    runOnUiThread(new Runnable() {
    public void run() {
            Toast.makeText(<your class name>.this, "hello", Toast.LENGTH_SHORT).show();
        }
    });
    

    或在 onPostExecute (后台计算完成后在UI线程上调用)

    Toast.makeText(<your class name>.this, "hello", Toast.LENGTH_SHORT).show();
    

    编辑: 如果要将上下文传递给AsyncTask_¼,可以这样做:

    public class MyAsyncTask extends AsyncTask<Void, Integer, List<List<String>>>
    
        private final Context mContext;
    
        public MyAsyncTask(final Context context) {
             mContext = context;
        }
    }
    

    在主要活动中

    final MyAsyncTask task = new MyAsyncTask(getApplicationContext());
    task.execute();
    

    再次编辑: 我成功地测试了Weakreference。

    public class ExampleAsyncTask extends AsyncTask {
        private WeakReference<Context> contextRef;
    
        public ExampleAsyncTask(Context context) {
            contextRef = new WeakReference<>(context);
        }
    
    
        @Override
        protected void onPostExecute(Object result) {
            Context context = contextRef.get();
            if (context != null) {
                Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    在主活动中:

      new ExampleAsyncTask(MainActivity.this).execute();
    
        2
  •  0
  •   Longalei    6 年前

    是的,不用担心您可以使用应用程序上下文。可能如下所示:

    在应用程序中实现app.getContext()。

    并在“fetch”类中使用它,并在mainthread中执行它。