【问题标题】:Toast in AsyncTask in non Activity class非 Activity 类中 AsyncTask 中的 Toast
【发布时间】:2015-04-23 21:55:49
【问题描述】:

我有一个非 Activity 类,其中包含一个调用 URL 的 AsyncTask。 如果由于某些原因连接超时,我想通过发布 Toast 让用户知道这一点。 但我无法获得任何上下文。

如何做到这一点?

RPIcall.class

import android.os.AsyncTask;
import android.util.Log;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.HttpHostConnectException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

import java.io.IOException;

class RPicall extends AsyncTask<String, String, Void> {

    @Override
    protected Void doInBackground(String... uri) {

        int timeoutSocket       = 3000;
        int timeoutConnection   = 3000;

        try{

            Log.v("call URL: ", uri[0]);

            HttpGet httpGet = new HttpGet(uri[0]);
            HttpParams httpParameters = new BasicHttpParams();
            // Set the timeout in milliseconds until a connection is established.
            // The default value is zero, that means the timeout is not used. 

            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            // Set the default socket timeout (SO_TIMEOUT) 
            // in milliseconds which is the timeout for waiting for data.

            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpResponse response = httpClient.execute(httpGet);

        } catch (ClientProtocolException e) {
            //Here Connection TimeOut excepion
            //Toast.makeText(, "Your connection timedout", Toast.LENGTH_SHORT).show();
            Log.v("Server not Reachable: ", uri[0]);
            publishProgress("TimeOut");

        } catch (HttpHostConnectException e) {

            Log.e("Server not Reachable: ", uri[0]);

        }

        catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        String test = "test";
        Log.v("finished: ", test);

    }
}

【问题讨论】:

    标签: android android-asynctask toast android-context


    【解决方案1】:

    第 1 步:向 RPicall 添加一个构造函数,该构造函数接受 Context,并将其存储在数据成员中。

    第 2 步:在 onPostExecute() 中使用 Context 来显示您的 Toast

    第 3 步:在创建 RPicall 的实例时传入合适的 Context

    【讨论】:

    • 谢谢你,和@Blackbelt一起回答我知道了!
    【解决方案2】:

    定义一个以 Context 对象为参数的构造函数,并将其保留为类成员。例如:

    class RPicall extends AsyncTask<String, String, Void> {
    
           private final Context mContext;
           public RPicall(Context c) {
              mContext = c;
           }
    
     }
    

    【讨论】:

    • 谢谢你,连同@CommonsWare 回答我知道了!
    猜你喜欢
    • 2019-04-19
    • 2014-11-06
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2016-04-24
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多