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

このように呼びます

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が必要なので、コンストラクターを介してsをContext渡し、それを使用して表示しますActivityContextToast

のためにgetApplicationContext()からを呼び出したい、または呼び出したいという理由はありません。は、が明らかにすでに持っているを必要とし、それが参照するものですActivityToastToastActivity ContextActivitythis

于 2013-06-22T02:00:33.763 に答える
0

試してみるべきことの 1 つは、IMO としては、いずれにせよ良いプログラミング方法です。Context オブジェクトが必要な場合は、親クラスから継承された空のコンストラクターを使用する代わりに、AsyncTask サブクラスのコンストラクターでそれを宣言する必要があります。doInBackground() 関数が正常に実行された場合は、onPostExecute() にドロップダウンする必要があります。doInBackground() の最後と onPostExecute() の開始時に何かを記録してみてください。これにより、1 つのコールバックが完了し、フローの次のコールバックに移行したことがわかります。

その場合、コードは次のようになります。

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 に答える