Android AsyncTask-如何从url显示数据

Android AsyncTask-如何从url显示数据,android,android-asynctask,Android,Android Asynctask,我已经读了很多关于这个主题的书,但是我仍然没有得到我想要的结果。 我有一个URL(),我需要从中获取数据并将其显示在android屏幕上。 我遵循了本教程:,但我只需要显示数据,而不是计算 我已经创建了一个onPreExecute、onPostExecute和一个doInBackground,它应该在那里获取数据但我有一个错误:com.example.ivap.msnis.MainActivity'不是封闭类 我需要从url获取数据并将其存储在变量中。 这是我的密码: package com.e

我已经读了很多关于这个主题的书,但是我仍然没有得到我想要的结果。 我有一个URL(),我需要从中获取数据并将其显示在android屏幕上。 我遵循了本教程:,但我只需要显示数据,而不是计算

我已经创建了一个onPreExecute、onPostExecute和一个doInBackground,它应该在那里获取数据但我有一个错误:com.example.ivap.msnis.MainActivity'不是封闭类

我需要从url获取数据并将其存储在变量中。 这是我的密码:

package com.example.ivanp.msnis;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * A simple {@link Fragment} subclass.
 */
public class TvrdjavaFragment extends Fragment {

    Button btnIdinaperiod;
    TextView pokaziServer;
    String rezultat = "";
    String strURL = "http://e085d133.ngrok.io/android_merenja";

    public TvrdjavaFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_tvrdjava, container, false);
        // Inflate the layout for this fragment

        pokaziServer = (TextView) view.findViewById(R.id.testServer);
        int i = Integer.parseInt(pokaziServer.getText().toString());

        new NabaviServer().execute();

        });

        return view;
    }

    public class NabaviServer extends AsyncTask<String, String, String>
    {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(String s) {
            //super.onPostExecute(s);

            Toast.makeText(MainActivity.this, "Izlazak je: " + rezultat,Toast.LENGTH_LONG);
        }

        @Override
        protected String doInBackground(String... params) {

            try{
                URL url = new URL(strURL);
                HttpURLConnection con = (HttpURLConnection)url.openConnection();
                con.setRequestMethod("GET");
                con.connect();

                BufferedReader bf = new BufferedReader(new InputStreamReader(con.getInputStream())); //??s

                String value = bf.readLine();
                System.out.println("test " + value);
                rezultat = value;

            }
            catch(Exception e)
            {
                System.out.println(e);
            }

            return null;
        }
    }

}
package com.example.ivanp.msnis;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentTransaction;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.Button;
导入android.widget.TextView;
导入android.widget.Toast;
导入java.io.BufferedReader;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.text.simpleDataFormat;
导入java.util.Date;
/**
*一个简单的{@link Fragment}子类。
*/
公共类TvrdjavaFragment扩展了片段{
按钮时间段;
文本视图服务器;
字符串rezultat=“”;
字符串strURL=”http://e085d133.ngrok.io/android_merenja";
公共TvrdjavaFragment(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment_tvrdjava,容器,false);
//为该碎片膨胀布局
pokaziServer=(TextView)view.findviewbyd(R.id.testServer);
int i=Integer.parseInt(pokaziServer.getText().toString());
新建NabaviServer().execute();
});
返回视图;
}
公共类NabaviServer扩展异步任务
{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的void onPostExecute(字符串s){
//super.onPostExecute(s);
Toast.makeText(MainActivity.this,“Izlazak je:+rezultat,Toast.LENGTH_LONG);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
URL=新URL(strURL);
HttpURLConnection con=(HttpURLConnection)url.openConnection();
con.setRequestMethod(“GET”);
con.connect();
BufferedReader bf=新的BufferedReader(新的InputStreamReader(con.getInputStream());/
字符串值=bf.readLine();
系统输出打印项次(“测试”+数值);
rezultat=数值;
}
捕获(例外e)
{
系统输出打印ln(e);
}
返回null;
}
}
}
更改此选项

Toast.makeText(MainActivity.this, "Izlazak je: " + rezultat,Toast.LENGTH_LONG);
对此

Toast.makeText(getActivity(), "Izlazak je: " + rezultat,Toast.LENGTH_LONG).show();
因为您的代码存在于
TvrdjavaFragment
中,并且在此片段内,您不能使用MainActivity.this作为上下文,您可以使用
getActivity()
获取片段内的活动上下文

最好是在android提供的日志中打印响应来检查输出,比如您可以使用
Log.d(“Izlazak je:”,rezultat),您可以在此处阅读有关日志的更多信息

更改此选项

Toast.makeText(MainActivity.this, "Izlazak je: " + rezultat,Toast.LENGTH_LONG);
对此

Toast.makeText(getActivity(), "Izlazak je: " + rezultat,Toast.LENGTH_LONG).show();
因为您的代码存在于
TvrdjavaFragment
中,并且在此片段内,您不能使用MainActivity.this作为上下文,您可以使用
getActivity()
获取片段内的活动上下文


最好是在android提供的日志中打印响应来检查输出,比如您可以使用
Log.d(“Izlazak je:”,rezultat),您可以在此处阅读有关日志的更多信息

您的toast正在使用未知上下文 请将其更改为应用程序上下文或本地上下文

  Toast.makeText(getActivity(), "Izlazak je: " + rezultat,Toast.LENGTH_LONG);
    }

您的祝酒词使用了未知上下文 请将其更改为应用程序上下文或本地上下文

  Toast.makeText(getActivity(), "Izlazak je: " + rezultat,Toast.LENGTH_LONG);
    }

Toast.makeText
使用对象
MainActivity.this
,但它在片段类中。通常,
XXX。此
仅在类XXX中用于引用类XXX实例本身

选择1 您可以调用
getActivity()
来获取片段所附加的活动的引用

但是要小心,根据Fragment的生命周期
getActivity()
只返回
Fragment.onAttach
Fragment.onDetach
之间的有效值。如果
onPostExecute
onTach
之前或之后执行,则
getActivity()
将返回null

因此,请在使用之前检查
getActivity()
的返回值。否则将导致崩溃

选择2 您还可以将应用程序上下文用于Toast。下面的代码创建您自己的应用程序类,然后您可以将
MyApplication.getInstance()
用作代码中任何地方的上下文。像这样
Toast.makeText(MyApplication.getInstance(),…).show()
。记住在
makeText
之后调用
show()
,您的代码将丢失它

公共类MyApplication扩展了应用程序{

private static MyApplication instance;

@Override
public void onCreate() {
    super.onCreate();
    instance = this;
}

public static MyApplication getInstance(){
    return instance;
}

}
Toast.makeText
使用对象
MainActivity.this
,但它在您的Fragment类中。通常,
XXX。此
仅在类XXX中用于引用类XXX实例本身

选择1 您可以调用
getActivity()
来获取片段所附加的活动的引用

但是要小心,根据Fragment的生命周期
getActivity()
只返回
Fragment.onAttach
Fragment.onDetach
之间的有效值。如果在
onAttach
之前执行
onPostExecute
,或