java - 如何从 onCreatemethod 调用 AsyncTask?

标签 java android android-asynctask

我正在开发简单的android应用程序,我正在使用此代码访问servlet,但我得到java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序 错误。 我试图在谷歌上搜索它,但找不到任何东西。“MY_IP_ADDRESS”被认为是我删除的系统的IP地址。请任何人都可以建议我在调用 AsyncTask 时缺少哪些地方。?

package com.example.nirmal.gaminghub;

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Looper;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
 import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;


public class DetailsOfGame extends AppCompatActivity {

public String gameID="";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details_of_game);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    TextView tv = (TextView) findViewById(R.id.ID);
    Bundle extras = getIntent().getExtras();
        String value = extras.getString("gameID");
        //tv.setText(value);
        gameID = value;
        Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_LONG).show();
        new ViewDetailsTask(DetailsOfGame.this).execute();
        Toast.makeText(getApplicationContext(), "hello there", Toast.LENGTH_LONG).show();
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

public class ViewDetailsTask extends AsyncTask<Void, Void, Void>{
    TextView tv=(TextView)findViewById(R.id.ID);
    StringBuilder getOutput = new StringBuilder();

    DetailsOfGame detailsOfGame=null;
    ViewDetailsTask(DetailsOfGame detailsOfGame)
    {
        this.detailsOfGame=detailsOfGame;
    }
    protected Void doInBackground(Void... param) {

        try {
            String gmID=gameID;
            URL openUrl = new URL("http://MY_IP_ADDRESS:8080/GamingHub/ShowDataServlet");
            Toast.makeText(getApplicationContext(), "in async task ", Toast.LENGTH_LONG).show();

            HttpURLConnection connection = (HttpURLConnection) openUrl.openConnection();

            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setDoInput(true);
            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line = "";

            while ((line = br.readLine()) != null) {
                getOutput.append(line);
            }
            br.close();

        } catch (Exception e) {
            e.printStackTrace();
           // Toast.makeText(getApplicationContext(), "in async task exception", Toast.LENGTH_LONG).show();
        }
        return null;
    }
    protected void onPostExecute(Void result)
    {
        tv.setText(getOutput);
    }
}
}

最佳答案

尝试从 UI 线程调用 Toast.makeText(...):

getActivity().runOnUiThread(new Runnable() {
  public void run() {
    Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
  }
});

关于java - 如何从 onCreatemethod 调用 AsyncTask?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36665600/

相关文章:

java - Maven 父 pom 与模块 pom

java - .getInetAddress() 返回的不是实际 IP

java.lang.NoSuchMethodException : scala. collection.immutable.$冒号$冒号

Android:处理从服务器连续拉取的最佳方式?

java - 在 Java 应用程序中导入/导出 Google 联系人

android - 替换 com.google.android.gms :play-services with google-play-services. jar

android - 无法支持多种屏幕分辨率

android - 错误 aapt : Attribute "font" already defined with incompatible format. 此处定义的原始属性

android - 使用 AsyncTask 的服务每 X 次执行一次请求

java - 每当我单击“后退”/“主页”按钮时,代码的asynctask部分就会关闭/停止该应用程序