繁体   English   中英

AsyncTask 不适用于 okhttp 发布请求

[英]AsyncTask not working with okhttp post request

当我尝试运行应用程序时,应用程序的行为方式是黑屏 -> 返回主活动。

这是我的代码:

public class ResultsActivity extends AppCompatActivity {

final TextView textView = findViewById(R.id.textView);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_results);
    new NetworkTask().execute();
}

public void backToMain(View v) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

private class NetworkTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        final String image = getExternalCacheDir() + "/image.jpeg";
        File file = new File(image);
        try {
            final MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg");
            RequestBody requestBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("images", "image.jpeg",
                            RequestBody.create(file, MEDIA_TYPE_JPEG))
                    .addFormDataPart("organs", "leaf")
                    .build();
            Request request = new Request.Builder()
                    .url("insert url here")
                    .post(requestBody)
                    .build();
            OkHttpClient client = new OkHttpClient();
            Response response = client.newCall(request).execute();
            String result = response.body().string();
            return result;
        } catch(IOException e) {
            e.printStackTrace();
            return "error";
        }
    }

    @Override
    protected void onPostExecute(String result) {
        if(result.equals("error")) {
            textView.setText("error");
        } else {
            textView.setText(result);
        }
    }
}

我相当确定发布请求可以正常工作,因为我已经使用以下方法对其进行了测试:

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

所以,也许问题在于我把它放在 AsyncTask 中的方式。

正如卡尔所说,我将这行代码放在 doInBackground 方法上。 我的问题已经解决了。

            @Override
            protected String doInBackground(String... params) {   
                    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                    StrictMode.setThreadPolicy(policy);
                    //...
           }

在某些情况下使用 AsyncTask 是必要的,例如发送图像队列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM