1

我正在尝试从异步任务中发布祝酒词,并在堆栈上阅读此答案:

从 AsyncTask 举杯

对这些问题的快速总结导致了这一点:

通过从 MainActivity 调用 getApplicationContext() 获取 Context 对象并将其作为参数传递给您的 AsyncTask

我对如何通过异步任务传递上下文以及如何调用它感到困惑:

我的异步任务是:

public class ReadLogInJSON extends AsyncTask<String, Void, String>
{
    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        return readJSONFeed(arg0[0]);
    }

    protected void onPostExecute(String result)
    {
        //decode json here
        try{
            JSONObject json = new JSONObject(result);
            String status = json.getString("status");

            if(status == "no"){
                //toast logIN failed
                String message = "Log In Failed";
                Toast.makeText(this,  message, Toast.LENGTH_SHORT).show();
            }
            else {
                //get userName
                //get user ID
                //set preferences
                //launch normal activity
            }
        }
        catch(Exception e){
        }
    }

    public String readJSONFeed(String URL) {
        StringBuilder stringBuilder = new StringBuilder();
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(URL);
        try {
            HttpResponse response = httpClient.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
                InputStream inputStream = entity.getContent();
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(inputStream));
                String line;
                while ((line = reader.readLine()) != null) {
                    stringBuilder.append(line);
                }
                inputStream.close();
            } else {
                Log.d("JSON", "Failed to download file");
            }
        } catch (Exception e) {
            Log.d("readJSONFeed", e.getLocalizedMessage());
        }
        return stringBuilder.toString();
    }
}

我用这个来称呼它:

new ReadLogInJSON().execute(url);
4

3 回答 3

1

您正在尝试在主线程上运行的 onPostExecute 敬酒,因此您不需要将上下文传递给您的任务。你应该能够做到这一点:

Toast.makeText(MyActivity.this,  message, Toast.LENGTH_SHORT).show();

你也可以使用getApplicationContext()

Toast.makeText(getApplicationContext(),  message, Toast.LENGTH_SHORT).show();
于 2013-06-22T02:02:28.447 回答
0

您应该尝试的一件事,IMO,无论如何,这是一种很好的编程习惯,如果您需要一个 Context 对象,那么您应该在 AsyncTask 子类的构造函数中声明它,而不是使用从父类继承的空构造函数。如果您的 doInBackground() 函数成功执行,那么您应该下拉到 onPostExecute()。尝试在 doInBackground() 末尾和 onPostExecute() 开始时记录一些内容,以便您知道您完成了一个回调并转换到流程中的下一个。

在这种情况下,您的代码看起来更像:

public class ReadLogInJSON extends AsyncTask<String, Void, String> {
    private Context mContext;
    public ReadLoginJSON(Context context) {
        this.mContext = context;
    }

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        return readJSONFeed(arg0[0]);
    }

    @Override
    public void onPostExecute(String result){
       // DO YOUR THING HERE
       Toast.makeText(this.mContext, "I Executed!", Toast.LENGTH_SHORT).show();
}
于 2013-06-22T03:12:55.030 回答
0

像这样称呼它

ReadLogInJSON task = new ReadLogInJSON(this);  // pass Context here to constructor
task .execute(url);

并像这样在您的 AsyncTask 中创建一个构造函数

  public class ReadLogInJSON extends AsyncTas <String, Void, String> {

  Context c;

  public ReadLogInJSON(Context context)
  {
      c = context;  // assign Context in constructor here
  }

  @Override1
  protected String doInBackground(String... arg0) {
    // TODO Auto-generated method stub
    return readJSONFeed(arg0[0]);

然后把你Toast改成onPostExecute()这个

 Toast.makeText(c,  message, Toast.LENGTH_SHORT).show();

Toast需要 aContext所以你通过构造函数传递你Activity的 sContext并使用它来显示你的Toast

从来没有理由或想getApplicationContext()从一个Activityfor a中调用Toast。AToast需要 anActivity Context显然Activity已经拥有并且是this所指的

于 2013-06-22T02:00:33.763 回答