-1

如何将不同的类型参数发送到 AsyncTask。

我正在使用 J Son/php 在 android 中开发登录系统。我得到了 NetworkOnMainThread 异常,有人建议我在我的代码中实现 AsyncTask。我需要以字符串和列表形式发送 URL。我怎样才能将它发送到函数?这些值是从其他类发送的。

public class JSONParser extends AsyncTask<String,Void,JSONObject>

我不知道我是否正确。希望回应。

这是我的修改完成

private String url;
private List<NameValuePair> params;
@Override
protected JSONObject doInBackground(String... args) {

    return getJsonFromURL(url,params);
}

void callJson(String url,List<NameValuePair> params){
   this.url=url;
    this.params=params;
}

我这样调用 AsyncTask :

jsonParser=new JSONParser();
    jsonParser.setter(LoginUrl, username,password);
    try {
        jsonObject= jsonParser.execute("").get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

    return jsonObject;

现在收到此错误。

2843-2858/? E/JSON Parser﹕ Error parsing data org.json.JSONException: Value loginRegistration of type java.lang.String cannot be converted to JSONObject
    01-07 10:04:09.808    2843-2843/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
        Process: artha.ordermaking.KOT, PID: 2843
        java.lang.NullPointerException
                at 

    ex.WelcomeActivity$PlaceholderFragment.loginProcess(WelcomeActivity.java:84)
                    at ex.WelcomeActivity$PlaceholderFragment$1.onClick(WelcomeActivity.java:118)

请注意,我已经更改了上面提交的代码。

4

5 回答 5

0

异步任务使用的三种类型如下:

第一个,Params,执行时发送给任务的参数类型。第二个,Progress,后台计算时发布的进度单元的类型。第三个,Result,后台计算结果的类型。

如果您需要向 AsyncTask 传递其他数据,只需创建一个在 AsyncTask 中接收该数据并在主 UI 中调用它的方法。例如:

public void setMyHandler(Handler h) { myhandler = h; }

您可以在此处的 AsyncTask 帮助页面上找到更多信息。

于 2014-01-13T09:04:37.830 回答
0

您可以Constructor在您的AsyncTask类中创建并可以将数据提取到其中。

参数如下AsyncTask <TypeOfVarArgParams , ProgressValue , ResultValue> .

TypeOfVarArgParamsdoInBackground()作为输入传递给方法,ProgressValue用于进度信息,ResultValue必须从方法返回并作为参数doInBackground()传递给)。onPostExecute(

您如何发现本教程对学习该主题非常有帮助。这是教程Android Background Processing with Handlers and AsyncTask and Loaders - Tutorial

于 2014-01-13T09:04:53.387 回答
0

您可以定义一个包含所有必要数据的类,并将该类用作 AsyncTask 的参数。或者如果 AsyncTask 参数让你烦恼,你可以使用 runOnUiThread 和线程:

class Login implements Runnable{
    public Login(parameters...){    
    }
    @Override
    public void run() {
            //Login
            runOnUiThread(new LoginResult(params...));
    }
}

class LoginResult implements Runnable{
    public Login(parameters...){    
    }
    @Override
    public void run() {
    }
}

……

new Thread(new Login()).start();
于 2014-01-13T10:07:35.827 回答
0

您应该使用execute()而不是直接doInBackground()在 UI 线程中调用异步任务来调用异步任务,正如堆栈跟踪所证明的那样:

at artha.ordermaking.KOT.library.JSONParser.doInBackground(JSONParser.java:36)
at artha.ordermaking.KOT.library.UserFunctions.loginUser(UserFunctions.java:37)

来自评论:

jsonObject=jsonParser.execute(); 它不工作。我需要得到 JSONObject。execute() 正在返回 AsyncTask 对象。

如果您等待其完成,那将不是异步任务。

相反,请在可以访问结果doInBackground()的 UI 中进行所有处理并更新。此更新还可能涉及在您的 UI 代码中调用回调方法。onPostExecute()doInBackground()

在您更新的问题中:

jsonObject= jsonParser.execute("").get();

get()是错误的解决方案。它阻塞当前线程(UI 线程),直到异步任务完成。因此,您又回到了起点:阻止网络操作阻塞 UI 线程。

于 2014-01-13T13:57:38.843 回答
-1

避免 NetworkOnMainThreadException 的非常简单的方法

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
        .permitAll().build();
StrictMode.setThreadPolicy(policy);

将这些行放入您onCreate(Bundle savedInstanceState)的 Activity 方法中

于 2014-01-13T09:40:16.617 回答