2016-11-05 61 views
0
public class ayncClass extends AsyncTask<String, Void, String> { 

     public void onPreExecute(){ 


     } 
     @Override 
     protected String doInBackground(String... params) { 
      HttpClient client = new DefaultHttpClient(); 
      HttpGet get = new HttpGet(URL HERE); 
      try{ 
       HttpResponse responseGiven = client.execute(get); 
       StatusLine statusLine = responseGiven.getStatusLine(); 
       int statusCode = statusLine.getStatusCode(); 
       if(statusCode == 404){ 
        Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show(); 

       } 
      } catch(Exception e){ 

      } 
      return null; 
     } 

     public void onPostExecute(...){ 
      super.onPostExecute(s); 

     } 

    } 

但是,当我调试并运行应用程序时,它会得到Toast显示。在AsyncTask工作的时候,有没有办法做到这一点?在AsyncTask中显示Toast

谢谢!

+0

请检查http://stackoverflow.com/questions/3134683/android-toast-in-a-thread – abhishesh

+0

请参阅:http://stackoverflow.com/questions/6134013/android-how-can-i-show -a-to-a-thread-running-in-a-remote-service – abhishesh

+0

你不能在doInBackground方法中显示吐司,你必须在onPostExecute方法中显示吐司 –

回答

-1

你不能在doInBackground函数中显示吐司,因为在UI线程上doInBackground函数不起作用。您可以将进度发布到onProgressUpdate函数。它将在UI线程上工作。

public class ayncClass extends AsyncTask<String, Void, String> { 

    private final Context context; 

    public ayncClass(Context context) { 
     this.context = context; 
    } 

    public void onPreExecute(){ 


    } 
    @Override 
    protected String doInBackground(String... params) { 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(URL HERE); 
     try{ 
      HttpResponse responseGiven = client.execute(get); 
      StatusLine statusLine = responseGiven.getStatusLine(); 
      int statusCode = statusLine.getStatusCode(); 
      if(stat-usCode == 404){ 
      // you can not use toast in doInBackground function. you need to pass to progress 
      publishProgress(0); 
      } 
     } catch(Exception e){ 

     } 
     return null; 
    } 

    @Override 
     protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
     Toast.makeText(context, "ERROR", Toast.LENGTH_SHORT).show(); 
     } 

    public void onPostExecute(...){ 
     super.onPostExecute(s); 

    } 

} 
0

试试下面

public class ayncClass extends AsyncTask<String, Void, String> { 

    public void onPreExecute(){ 


    } 
    @Override 
    protected String doInBackground(String... params) { 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(URL HERE); 
     try{ 
      HttpResponse responseGiven = client.execute(get); 
      StatusLine statusLine = responseGiven.getStatusLine(); 
      int statusCode = statusLine.getStatusCode(); 
      if(statusCode == 404){ 
       // Toast.makeText(getApplicationContext(), "ERROR", //Toast.LENGTH_SHORT).show(); 

      } 
     } catch(Exception e){ 

     } 
     return String.valueOf(statusCode); // make this change 
    } 

    public void onPostExecute(String result){ 
     super.onPostExecute(s); 
Toast.makeText(getApplicationContext(), result, 
Toast.LENGTH_SHORT).show(); 
    } 

} 
1

你应该用我的代码here

public enum Toaster { 
    INSTANCE; 

    private final Handler handler = new Handler(Looper.getMainLooper()); 

    public void showToast(final Context context, final String message, final int length) { 
     handler.post(
      new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(context, message, length).show(); 
       } 
      } 
     ); 
    } 

    public static Toaster get() { 
     return INSTANCE; 
    } 
} 

然后,你可以做

Toaster.get().showToast(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT); 

这将在用户界面上运行代码线程,它会工作。

+0

在这里使用'enum'是否有特定的原因?不会简单的静态方法效率更高吗?根据[this](https://developer.android.com/topic/performance/memory.html)开发者指南文章_“你应该严格避免在Android上使用枚举”_。 – earthw0rmjim

+0

@ earthw0rmjim枚举单例模式,就是这样。至于“严格避免使用枚举”,那么'enum's只是类,我们应该停止使用类?但是,是的,关键是发布到UI线程的处理程序。 – EpicPandaForce

+0

不,我们不应该停止使用类,因为没有更高效的替代方案:)虽然有枚举。为什么是单身模式?这里没有属于特定情况的状态。为什么不只是一个简单的静态方法? – earthw0rmjim

3

Toast属于UI。

我们只能在主线程(UI线程)中更新UI。

AsyncTask.doInBackground()将永远不会在主线程中调用,这就是原因。

0

在PostExecute方法中始终放置Toast消息。

public void onPostExecute(...) { super.onPostExecute(s);

Toast.makeText(context, "Hellooo I am at Post Execute method", Toast.LENGTH_SHORT).show(); 
    } 
0

Toast只能从UI线程显示。在UI线程中调用onPostExecute,因此您可以将statusCode存储在成员变量中,并在onPostExecute方法中检查404,并在那里显示Toast。事情是这样的:

public class ayncClass extends AsyncTask<String, Void, String> { 

    private int mStatusCode; 

    @Override 
    protected String doInBackground(String... params) { 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(URL HERE); 
     try{ 
      HttpResponse responseGiven = client.execute(get); 
      StatusLine statusLine = responseGiven.getStatusLine(); 
      mStatusCode = statusLine.getStatusCode(); 
     } catch(Exception e){ 
      // do NOT let catch blocks without log 
      // if something bad happens you will never know 
     } 
     return null; 
    } 

    public void onPostExecute(...){ 
     super.onPostExecute(s); 
     if(mStatusCode == 404){ 
      Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

或者只是通过状态代码作为参数传递给onPostExecute:

public class ayncClass extends AsyncTask<String, Void, Integer> { 

    @Override 
    protected Integer doInBackground(String... params) { 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(URL HERE); 
     try{ 
      HttpResponse responseGiven = client.execute(get); 
      StatusLine statusLine = responseGiven.getStatusLine(); 
      return statusLine.getStatusCode(); 
     } catch(Exception e){ 
      // do NOT let catch blocks without log 
      // if something bad happens you will never know 
     } 
     return -1; 
    } 

    public void onPostExecute(Integer statusCode){ 
     super.onPostExecute(s); 
     if(statusCode == 404){ 
      Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 
1

这可能有助于

onPreExecute(){// 一些代码#1 }

doInBackground() { 
    runOnUiThread(new Runnable() { 
       public void run() { 
        // some code #3 (Write your code here to run in UI thread) 

       } 
      }); 
} 

onPostExecute() { 
    // some code #3 
} 
0

简单,当你必须显示的东西进入你的UI线程(例如吐司消息)然后写:

runOnUiThread(new Runnable(){ 
    public void run() { 
     //Interaction with UI (Toast message) 
    } 
}); 
1

Toast是UI元素,它不来了,因为你的应用程序的UI在UI线程上运行,而doInBackground方法的AsyncTask运行在不同的线程中。因此,无论您想要执行的与UI相关的操作应该在onPostExecuteonPreExecute之内。如果出现这种情况,您必须更新doInBackground中的用户界面,您可以使用处理程序线程或最佳方式,您可以使用runOnUiThread方法,并在其中添加您的敬酒。